/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bs.stock.modelo;

import bs.global.modelo.Auditoria;
import bs.global.modelo.Moneda;
import bs.ventas.modelo.ConceptoVenta;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


/**
 *
 * @author Claudio
 */
@Entity
@Table(name = "st_producto")
public class Producto implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "CODIGO", nullable = false, length = 30)
    private String codigo;

    @JoinColumn(name = "TIPPRO", referencedColumnName = "TIPPRO")
    @ManyToOne(optional=false,fetch=FetchType.LAZY)
    private TipoProducto tipoProducto;

    @Column(name = "DESCRP", nullable = false, length = 120)
    private String descripcion;

    //Peso maximo
    @Column(name = "PESMAX", precision = 15, scale = 4)
    private BigDecimal pesosMaximo;

    //Peso minimo
    @Column(name = "PESMIN", precision = 15, scale = 4)
    private BigDecimal pesoMinimo;
    
    //Unidad de peso
    @JoinColumn(name = "UNIPES", referencedColumnName = "CODIGO")
    @ManyToOne(fetch=FetchType.LAZY)
    private UnidadMedida unidadDePeso;

    @Lob
    @Column(name = "OBSERV", length = 2147483647)
    private String observaciones;
    
    //Unidad de medida
    @JoinColumn(name = "UNIMED", referencedColumnName = "CODIGO")
    @ManyToOne(fetch=FetchType.LAZY)
    private UnidadMedida unidadDeMedida;

    //Stock minimo
//    @Basic(fetch=FetchType.LAZY)
    @Column(name = "STKMIN", precision = 15, scale = 4)
    private BigDecimal stockMinimo;

    //Stock maximo
//    @Basic(fetch=FetchType.LAZY)
    @Column(name = "STKMAX", precision = 15, scale = 4)
    private BigDecimal stockMaximo;

    //Punto de pedido
//    @Basic(fetch=FetchType.LAZY)
    @Column(name = "PTOPED", precision = 15, scale = 4)
    private BigDecimal puntoDePedido;
    
    //Dias de entrega
    @Column(name = "DIAENT")
    private Short diasEntrega;

    //Precio de referencia
    @Column(name = "PREREF", precision = 15, scale = 4)
    private BigDecimal precioReferencia;
    //GR_Moneda de referencia
    @JoinColumn(name = "MONREF", referencedColumnName = "CODIGO")
    @ManyToOne(fetch=FetchType.LAZY)
    private Moneda monedaDeReferencia;
    //Fecha de precio de referencia
    @Column(name = "FECREF", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date fechaReferencia;   
    
    //Precio de reposición
    @Column(name = "PREREP", precision = 15, scale = 4)
    private BigDecimal precioReposicion;    
    @JoinColumn(name = "MONREP", referencedColumnName = "CODIGO")
    @ManyToOne(fetch=FetchType.LAZY)
    private Moneda monedaReposicion;
    @Column(name = "FECREP")
    @Temporal(TemporalType.DATE)
    private Date fechaReposicion;
    
    //Precio ultima compra
    @Column(name = "PREUCO", precision = 15, scale = 4)
    private BigDecimal precioUltimaCompra;
    //GR_Moneda ultima compra    
    @JoinColumn(name = "MONUCO", referencedColumnName = "CODIGO")
    @ManyToOne(fetch=FetchType.LAZY)
    private Moneda monedaUltimaCompra;
    //Fecha ultima compra
    @Column(name = "FECUCO")
    @Temporal(TemporalType.DATE)
    private Date fechaUltimaCompra;

    //Precio de produccion
    @Column(name = "PREPRD", precision = 15, scale = 4)
    private BigDecimal precioProduccion;
    //Modeda de produccion)    
    @JoinColumn(name = "MONPRD", referencedColumnName = "CODIGO")
    @ManyToOne(fetch=FetchType.LAZY)
    private Moneda monedaDeProduccion;
    //Fecha de produccion)
    @Column(name = "FECPRD")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaProduccion;
        
    @JoinColumns({
        @JoinColumn(name = "RUBR01", referencedColumnName = "CODIGO", nullable = false, insertable=true, updatable=true),
        @JoinColumn(name = "TIPPRO", referencedColumnName = "TIPPRO", nullable = false, insertable=false, updatable=false)    
    })
    @ManyToOne(fetch = FetchType.LAZY)    
    private Rubro01 rubr01;    
    
    @JoinColumns({
        @JoinColumn(name = "RUBR02", referencedColumnName = "CODIGO", nullable = false, insertable=true, updatable=true),
        @JoinColumn(name = "TIPPRO", referencedColumnName = "TIPPRO", nullable = false, insertable=false, updatable=false)    
    })
    @ManyToOne(fetch = FetchType.LAZY)    
    private Rubro02 rubr02;    
    
    @JoinColumns({
        @JoinColumn(name = "RUBR03", referencedColumnName = "CODIGO", nullable = false, insertable=true, updatable=true),
        @JoinColumn(name = "TIPPRO", referencedColumnName = "TIPPRO", nullable = false, insertable=false, updatable=false)    
    })
    @ManyToOne(fetch = FetchType.LAZY)    
    private Rubro03 rubr03;    
    
    @JoinColumns({
        @JoinColumn(name = "RUBR04", referencedColumnName = "CODIGO", nullable = true, insertable=true, updatable=true),
        @JoinColumn(name = "TIPPRO", referencedColumnName = "TIPPRO", nullable = false, insertable=false, updatable=false)    
    })
    @ManyToOne(fetch = FetchType.LAZY)    
    private Rubro04 rubr04;    
    
    @JoinColumns({
        @JoinColumn(name = "RUBR05", referencedColumnName = "CODIGO", nullable = true, insertable=true, updatable=true),
        @JoinColumn(name = "TIPPRO", referencedColumnName = "TIPPRO", nullable = false, insertable=false, updatable=false)    
    })
    @ManyToOne(fetch = FetchType.LAZY)    
    private Rubro05 rubr05;    
    
    @JoinColumns({
        @JoinColumn(name = "RUBR06", referencedColumnName = "CODIGO", nullable = true, insertable=true, updatable=true),
        @JoinColumn(name = "TIPPRO", referencedColumnName = "TIPPRO", nullable = false, insertable=false, updatable=false)    
    })
    @ManyToOne(fetch = FetchType.LAZY)    
    private Rubro06 rubr06;    
    
    @JoinColumns({
        @JoinColumn(name = "RUBR07", referencedColumnName = "CODIGO", nullable = true, insertable=true, updatable=true),
        @JoinColumn(name = "TIPPRO", referencedColumnName = "TIPPRO", nullable = false, insertable=false, updatable=false)    
    })
    @ManyToOne(fetch = FetchType.LAZY)    
    private Rubro07 rubr07;    
    
    @JoinColumns({
        @JoinColumn(name = "RUBR08", referencedColumnName = "CODIGO", nullable = true, insertable=true, updatable=true),
        @JoinColumn(name = "TIPPRO", referencedColumnName = "TIPPRO", nullable = false, insertable=false, updatable=false)    
    })
    @ManyToOne(fetch = FetchType.LAZY)    
    private Rubro08 rubr08;    
    
    @JoinColumns({
        @JoinColumn(name = "RUBR09", referencedColumnName = "CODIGO", nullable = true, insertable=true, updatable=true),
        @JoinColumn(name = "TIPPRO", referencedColumnName = "TIPPRO", nullable = false, insertable=false, updatable=false)    
    })
    @ManyToOne(fetch = FetchType.LAZY)    
    private Rubro09 rubr09;    
    
    
    @Column(name = "DEFSER", length = 1)
    private String defineSerie;
      
    @Column(name = "DEFDES", length = 1)
    private String defineDespacho;
    //Numero de envase
    @Column(name = "DEFENV", length = 1)
    private String defineEnvase;
    //Numero otros
    @Column(name = "DEFOTR", length = 1)
    private String defineOtros;
    //Numero de atributo
    @Column(name = "DEFATR", length = 1)
    private String defineAtributo;
    //Numero de estante
    @Column(name = "DEFEST", length = 1)
    private String defineEstante;
    
    @Column(name = "DEFUBI", length = 1)
    private String defineUbicacion;
    
    //Indica si es considerado un bien de uso
    @Column(name = "BIEUSO")
    private Character bienDeUso;
 
       
    @JoinColumns({
        @JoinColumn(name = "MODCPT", referencedColumnName = "MODULO", nullable = false),
        @JoinColumn(name = "TIPCPT", referencedColumnName = "TIPCPT", nullable = false),
        @JoinColumn(name = "CODCPT", referencedColumnName = "CODIGO", nullable = false)
    })
    @ManyToOne(fetch = FetchType.LAZY)
    private ConceptoVenta conceptoVenta;
    
    //Cuenta contable de venta
    @Column(name = "CUENVT", length = 40)
    private String cuentaVenta;
    
    @Column(name = "PNUEVO", length=1)
    private String productoNuevo;
    //Imagen chica
    @Column(name = "IMGCHI", length = 40)
    private String imagenChica;
    //Imagen grande
    @Column(name = "IMGGRA", length = 40)
    private String imagenGrande;
    @Column(name = "KITSFC", length = 1)
    private String esKitVenta;    
    
    @Embedded
    private Auditoria auditoria;


    public Producto() {
        
    }
  
    public Producto(String artcod) {
        this.codigo = artcod;
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public TipoProducto getTipoProducto() {
        return tipoProducto;
    }

    public void setTipoProducto(TipoProducto tipoProducto) {
        this.tipoProducto = tipoProducto;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public BigDecimal getPesosMaximo() {
        return pesosMaximo;
    }

    public void setPesosMaximo(BigDecimal pesosMaximo) {
        this.pesosMaximo = pesosMaximo;
    }

    public BigDecimal getPesoMinimo() {
        return pesoMinimo;
    }

    public void setPesoMinimo(BigDecimal pesoMinimo) {
        this.pesoMinimo = pesoMinimo;
    }

    public UnidadMedida getUnidadDePeso() {
        return unidadDePeso;
    }

    public void setUnidadDePeso(UnidadMedida unidadDePeso) {
        this.unidadDePeso = unidadDePeso;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }
    
    public UnidadMedida getUnidadDeMedida() {
        return unidadDeMedida;
    }

    public void setUnidadDeMedida(UnidadMedida unidadDeMedida) {
        this.unidadDeMedida = unidadDeMedida;
    }

    public BigDecimal getStockMinimo() {
        return stockMinimo;
    }

    public void setStockMinimo(BigDecimal stockMinimo) {
        this.stockMinimo = stockMinimo;
    }

    public BigDecimal getStockMaximo() {
        return stockMaximo;
    }

    public void setStockMaximo(BigDecimal stockMaximo) {
        this.stockMaximo = stockMaximo;
    }

    public BigDecimal getPuntoDePedido() {
        return puntoDePedido;
    }

    public void setPuntoDePedido(BigDecimal puntoDePedido) {
        this.puntoDePedido = puntoDePedido;
    }

    public Short getDiasEntrega() {
        return diasEntrega;
    }

    public void setDiasEntrega(Short diasEntrega) {
        this.diasEntrega = diasEntrega;
    }

    public BigDecimal getPrecioReferencia() {
        return precioReferencia;
    }

    public void setPrecioReferencia(BigDecimal precioReferencia) {
        this.precioReferencia = precioReferencia;
    }

    public Moneda getMonedaDeReferencia() {
        return monedaDeReferencia;
    }

    public void setMonedaDeReferencia(Moneda monedaDeReferencia) {
        this.monedaDeReferencia = monedaDeReferencia;
    }

    public Date getFechaReferencia() {
        return fechaReferencia;
    }

    public void setFechaReferencia(Date fechaReferencia) {
        this.fechaReferencia = fechaReferencia;
    }

    public BigDecimal getPrecioReposicion() {
        return precioReposicion;
    }

    public void setPrecioReposicion(BigDecimal precioReposicion) {
        this.precioReposicion = precioReposicion;
    }

    public Moneda getMonedaReposicion() {
        return monedaReposicion;
    }

    public void setMonedaReposicion(Moneda monedaReposicion) {
        this.monedaReposicion = monedaReposicion;
    }

    public Date getFechaReposicion() {
        return fechaReposicion;
    }

    public void setFechaReposicion(Date fechaReposicion) {
        this.fechaReposicion = fechaReposicion;
    }

    public BigDecimal getPrecioUltimaCompra() {
        return precioUltimaCompra;
    }

    public void setPrecioUltimaCompra(BigDecimal precioUltimaCompra) {
        this.precioUltimaCompra = precioUltimaCompra;
    }

    public Moneda getMonedaUltimaCompra() {
        return monedaUltimaCompra;
    }

    public void setMonedaUltimaCompra(Moneda monedaUltimaCompra) {
        this.monedaUltimaCompra = monedaUltimaCompra;
    }

    public Date getFechaUltimaCompra() {
        return fechaUltimaCompra;
    }

    public void setFechaUltimaCompra(Date fechaUltimaCompra) {
        this.fechaUltimaCompra = fechaUltimaCompra;
    }

    public BigDecimal getPrecioProduccion() {
        return precioProduccion;
    }

    public void setPrecioProduccion(BigDecimal precioProduccion) {
        this.precioProduccion = precioProduccion;
    }

    public Moneda getMonedaDeProduccion() {
        return monedaDeProduccion;
    }

    public void setMonedaDeProduccion(Moneda monedaDeProduccion) {
        this.monedaDeProduccion = monedaDeProduccion;
    }

    public Date getFechaProduccion() {
        return fechaProduccion;
    }

    public void setFechaProduccion(Date fechaProduccion) {
        this.fechaProduccion = fechaProduccion;
    }

    public Rubro01 getRubr01() {
        return rubr01;
    }

    public void setRubr01(Rubro01 rubr01) {
        this.rubr01 = rubr01;
    }

    public Rubro02 getRubr02() {
        return rubr02;
    }

    public void setRubr02(Rubro02 rubr02) {
        this.rubr02 = rubr02;
    }

    public Rubro03 getRubr03() {
        return rubr03;
    }

    public void setRubr03(Rubro03 rubr03) {
        this.rubr03 = rubr03;
    }

    public Rubro04 getRubr04() {
        return rubr04;
    }

    public void setRubr04(Rubro04 rubr04) {
        this.rubr04 = rubr04;
    }

    public Rubro05 getRubr05() {
        return rubr05;
    }

    public void setRubr05(Rubro05 rubr05) {
        this.rubr05 = rubr05;
    }

    public Rubro06 getRubr06() {
        return rubr06;
    }

    public void setRubr06(Rubro06 rubr06) {
        this.rubr06 = rubr06;
    }

    public Rubro07 getRubr07() {
        return rubr07;
    }

    public void setRubr07(Rubro07 rubr07) {
        this.rubr07 = rubr07;
    }

    public Rubro08 getRubr08() {
        return rubr08;
    }

    public void setRubr08(Rubro08 rubr08) {
        this.rubr08 = rubr08;
    }

    public Rubro09 getRubr09() {
        return rubr09;
    }

    public void setRubr09(Rubro09 rubr09) {
        this.rubr09 = rubr09;
    }
    
    public String getDefineSerie() {
        return defineSerie;
    }

    public void setDefineSerie(String defineSerie) {
        this.defineSerie = defineSerie;
    }

    public String getDefineDespacho() {
        return defineDespacho;
    }

    public void setDefineDespacho(String defineDespacho) {
        this.defineDespacho = defineDespacho;
    }

    public String getDefineEnvase() {
        return defineEnvase;
    }

    public void setDefineEnvase(String defineEnvase) {
        this.defineEnvase = defineEnvase;
    }

    public String getDefineOtros() {
        return defineOtros;
    }

    public void setDefineOtros(String defineOtros) {
        this.defineOtros = defineOtros;
    }

    public String getDefineAtributo() {
        return defineAtributo;
    }

    public void setDefineAtributo(String defineAtributo) {
        this.defineAtributo = defineAtributo;
    }

    public String getDefineEstante() {
        return defineEstante;
    }

    public void setDefineEstante(String defineEstante) {
        this.defineEstante = defineEstante;
    }

    public String getDefineUbicacion() {
        return defineUbicacion;
    }

    public void setDefineUbicacion(String defineUbicacion) {
        this.defineUbicacion = defineUbicacion;
    }

    public Character getBienDeUso() {
        return bienDeUso;
    }

    public void setBienDeUso(Character bienDeUso) {
        this.bienDeUso = bienDeUso;
    }

    public ConceptoVenta getConceptoVenta() {
        return conceptoVenta;
    }

    public void setConceptoVenta(ConceptoVenta conceptoVenta) {
        this.conceptoVenta = conceptoVenta;
    }
    
    public String getCuentaVenta() {
        return cuentaVenta;
    }

    public void setCuentaVenta(String cuentaVenta) {
        this.cuentaVenta = cuentaVenta;
    }

    public String getProductoNuevo() {
        return productoNuevo;
    }

    public void setProductoNuevo(String productoNuevo) {
        this.productoNuevo = productoNuevo;
    }

    public String getImagenChica() {
        return imagenChica;
    }

    public void setImagenChica(String imagenChica) {
        this.imagenChica = imagenChica;
    }

    public String getImagenGrande() {
        return imagenGrande;
    }

    public void setImagenGrande(String imagenGrande) {
        this.imagenGrande = imagenGrande;
    }

    public String getEsKitVenta() {
        return esKitVenta;
    }

    public void setEsKitVenta(String esKitVenta) {
        this.esKitVenta = esKitVenta;
    }

    public Auditoria getAuditoria() {
        return auditoria;
    }

    public void setAuditoria(Auditoria auditoria) {
        this.auditoria = auditoria;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 23 * hash + (this.codigo != null ? this.codigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Producto other = (Producto) obj;
        if ((this.codigo == null) ? (other.codigo != null) : !this.codigo.equals(other.codigo)) {
            return false;
        }
        return true;
    }

    

    @Override
    public String toString() {
        return "Producto{" + "codigo=" + codigo  + "}";
    }

}
